/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
  //数组长度
  let m = prices.length

  /* 定义状态数组：
  dp[i][0]：第i天结束时，手里持有股票；
  dp[i][1]：第i天结束时，手里不持股票，处于冷冻期（当天刚刚卖出股票）；
  dp[i][2]：第i天结束时，手里不持股票，不在冷冻期（当天可以买入股票但不买入股票）。 */
  let dp = Array.from({ length: m }, () => new Array(3).fill(0))
  //初始化第0天的三种状态
  dp[0][0] = -prices[0]
  dp[0][1] = 0
  dp[0][2] = 0

  //遍历数组prices，计算后面几天的三种状态
  for (let i = 1; i < m; i++) {
    //计算第i天的状态0：1.第i-1天处于状态0，第i天不卖出。2.第i-1天处于状态2，第i天买入。
    dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2] - prices[i])
    //计算第i天的状态1：第i-1天必须处于状态0，第i天卖出
    dp[i][1] = dp[i - 1][0] + prices[i]
    //计算第i天的状态2：1.第i-1天处于状态1，第i天不买入。2.第i-1天处于处于状态2，第i天不买入。
    dp[i][2] = Math.max(dp[i - 1][1], dp[i - 1][2])
  }

  //返回第m-1天不持有股票时的较大者
  return Math.max(dp[m - 1][1], dp[m - 1][2])
};

console.log(maxProfit([1, 2, 3, 0, 2]))
